#ifndef ENGINE_H
#define ENGINE_H

#include "Config.h"
#include <SDL.h>
#include <SDL_ttf.h>
#include <vector>
#include <list>
#include <queue>

class TitleScreen;
class Object;
class PlayerObject;

//! Klasa Engine

class Engine {
  public:
    //! Konstruktor
    Engine();
    //! Destruktor
    ~Engine();
    //! Funkcja zwracajaca ekran
    SDL_Surface * GetSurface() { return fScreen; }
    //! Funkcja wczytujaca mape
    /*! \param filename nazwa pliku z mapa */
    int LoadMap(const char *filename);
    //! Funkcja uruchamiajaca silnik
    int Run();
    //! Funkcja dodajaca obiekt do kolejki rysowania
    void AddObject(unsigned int x, unsigned int y, Object *object);
    //! Funkcja usuwajaca obiekt z kolejki rysowania
    void RemoveObject(unsigned int x, unsigned int y);
    //! Funkcja odpowiedzialna za ruch
    void Move(unsigned int srcX, unsigned int srcY, unsigned int destX,
        unsigned int destY);
    //! Funkcja dodajaca obiekt do kolejki "poruszajacych sie"
    void AddMovable(Object *object) { fMovableObjects.push_back(object); }
    //! Funkcja usuwajaca obiekt z kolejki "poruszajacych sie"
    void RemoveMovable(Object *object) { fMovableObjects.remove(object); }

  private:
    //! Funkcja dodajaca obiekt do kolejki rysowania
    void _AddToDrawQueue(Object *object);
    void _HandleTick();
    //! Funkcja rysujaca ekran gry
    void _DrawGamescreen();
    //! Funkcja rysujaca GUI
    void _DrawGUI();
    //! Funkcja poruszajaca obiekty
    void _MoveObjects();
    //! Funkcja pozycjonujaca kamere na osi X
    inline void _PositionCameraX();
    //! Funkcja pozycjonujaca kamere na osi Y
    inline void _PositionCameraY();

    int fErrorCode;
    SDL_Surface *fScreen;
    const SDL_VideoInfo *fVideoInfo;
    SDL_TimerID fTimer;
    int fScreenPosX, fScreenPosY;

    TitleScreen *fTitleScreen;

    vector< vector<Object *> > fObjects;
    list<Object *> fMovableObjects;
    queue<Object *> fDrawQueue;
    bool fRecheck;

    PlayerObject *fPlayer;
    int fMoveStarted;
    int fDiamonds;
    bool fMapInitialized;
    unsigned int fMapWidth, fMapHeight;
    unsigned int fTimeLimit, fTicks;
    unsigned int fLevel;

    int fKeysPressed;
    SDLKey fKey;

    TTF_Font *fFont;
    SDL_Surface *fGUI;
    bool fNeedGUIRedraw;
    
    SDL_Surface *fGameOverGfx;
    bool fAlive;
};

#endif
